#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <limits.h>

typedef struct // ��Ϣ���нṹ
{
	long int nType;	  // ����
	char szText[256]; // ����
} MSG;

int getMSG(MSG *M) // ��ȡ��Ϣ
{
	key_t Ikey;
	int n, nMsgld;
	MSG msg;
	if ((Ikey = ftok("/etc/profile", 1)) == -1)
	{
		perror("ftok");
		exit(1);
	}
	if ((nMsgld = msgget(Ikey, IPC_CREAT | 0666)) == -1)
	{
		perror("ftok");
		exit(2);
	}
	memset(&msg, 0x00, sizeof(MSG));									   // ��ն���
	if ((n = msgrcv(nMsgld, (void *)&msg, sizeof(msg.szText), 2L, 0)) < 0) // �Ӷ��н�����Ϣ
	{
		perror("msgrcv");
	}
	else
	{
		M->nType = msg.nType;		   // ������Ϣ����
		strcpy(M->szText, msg.szText); // ������Ϣ����
	}
	return 0;
}

int writepipe1(MSG m)
{
	int fd;
	if ((fd = open("./pp", O_WRONLY, 0)) < 0) // ֻд�򿪹ܵ�
	{
		printf("error!!!\n");
		perror("open");
		exit(-1);
	}
	else
	{
		FILE *ff;
		char buff[80];
		memset(buff, 0x00, sizeof(buff)); // ���
		ff = popen(m.szText, "r");
		fread(buff, sizeof(char), sizeof(buff), ff); // ���ո�FILE* ff��ȡ��buff��
		// int data_fd1, data_fd2;
		// data_fd1 = open("./back.txt", O_WRONLY); // ֻд���ļ�
		// write(data_fd1, buff, sizeof(buff));
		// int bytes_read = 0;
		// data_fd2 = open("./back.txt", O_RDONLY);	 // ֻ�����ļ�
		// bytes_read = read(data_fd2, buff, PIPE_BUF); // �������ļ���ȡ����
		write(fd, buff, 80);				 // д����
		// close(data_fd1);
		// close(data_fd2);
		pclose(ff);
		close(fd);
	}
	return 0;
}

int writepipe2()
{
	int fd;
	if ((fd = open("pp", O_WRONLY, 0)) < 0) // ֻд�򿪹ܵ�
	{
		printf("error!!!\n");
		perror("open");
		exit(-1);
	}
	else
	{
		close(fd);
	}
	return 0;
}

int run(MSG m)
{
	int fd;
	if ((fd = open("pp", O_WRONLY, 0)) < 0) // ֻд�򿪹ܵ�
	{
		printf("error!!!\n");
		perror("open");
		exit(-1);
	}
	else
	{
		FILE *ff;
		ff = popen(m.szText, "r");
		pclose(ff);
		close(fd);
	}
}

int main()
{
	MSG m;
	printf("sqw");
	while (1)
	{
		getMSG(&m); // ����Ϣ
		if (!strcmp("ls", m.szText) || !strcmp("pwd", m.szText))
		{
			writepipe1(m);
		}
		else if (!strcmp("exit", m.szText))
		{
			writepipe2();
			break;
		}
		else
		{
			// printf(m);
			run(m);
		}
	}
	return 0;
}
